package com.woniuxy;

import com.sun.org.apache.xpath.internal.SourceTree;
import com.woniuxy.proxy.UserProxy;
import com.woniuxy.service.EmpService;
import com.woniuxy.service.UserSerivce;
import com.woniuxy.service.impl.EmpServiceImpl;
import com.woniuxy.service.impl.UserServiceImpl;
import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import org.junit.Test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class AppProxy {
    @Test
    public void test1(){
        //目标对象
        UserSerivce userSerivce=new UserServiceImpl();
        //代理对象
        UserProxy userProxy=new UserProxy(userSerivce);
        userProxy.add("name");
        userProxy.delete();
    }
    @Test
    public void test2(){
        /**
         * JDK的动态代理，使用了Proxy中的静态方法newProxyInstance，该方法有三个参数
         *    ClassLoader loader：目标对象的类加载器
              Class<?>[] interfaces：目标对象的字节码的接口数组
              InvocationHandler h:
         */
        //目标对象
        final UserSerivce userSerivce=new UserServiceImpl();
        UserSerivce userSerivce1=(UserSerivce) Proxy.newProxyInstance(userSerivce.getClass().getClassLoader(), userSerivce.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("参数2:"+method);
                System.out.println("参数3："+args);
                System.out.println("检查权限");
                Object obj=method.invoke(userSerivce,args);
                System.out.println("记录日志");
                return obj;
            }
        });
        userSerivce1.add("Giles");
        userSerivce1.delete();
    }
    @Test
    public void test3(){
        //创建目标对象,该目标对象没有实现接口
        final EmpServiceImpl empService=new EmpServiceImpl();
        /**
         * create的两个参数含义
         * Class type：目标对象字节码对象
         * Callback callback，实际上常用的它的子接口
         *                MethodInterceptor
         */
        EmpServiceImpl empService1=(EmpServiceImpl) Enhancer.create(empService.getClass(), new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                System.out.println("权限检查");
                Object obj=method.invoke(empService,objects);
                System.out.println("日志记录");
                return obj;
            }
        });
        empService1.add();
        empService1.delete();
    }
}





















